class TripsController < ApplicationController
  # GET /trips
  # GET /trips.xml
  def index
    @trips = Trip.order("fechaHoraViaje").paginate(:page => params[:page], :per_page => 10)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @trips }
    end
  end

  # GET /trips/1
  # GET /trips/1.xml
  def show
    @trip = Trip.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @trip }
    end
  end

  # GET /trips/new
  # GET /trips/new.xml
  def new
    @trip = Trip.new
		@terminales = Station.find(:all, :order=>'ciudad')
		@tiposervs = ServiceType.find(:all, :order=>'descripcion')
		@promociones = Promotion.where("fecha_inicio > ?", Date.today).order("nombre")
    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @trip }
    end
  end

  # GET /trips/1/edit
  def edit
    @trip = Trip.find(params[:id])
		@terminales = Station.find(:all, :order=>'ciudad')
		@tiposervs = ServiceType.find(:all, :order=>'descripcion')
  end

  # POST /trips
  # POST /trips.xml
  def create
		#Calcula el numero de dias entre 2 fechas
		f_hasta = Date.parse("#{params[:fecha_hasta]['day']}-#{params[:fecha_hasta]['month']}-#{params[:fecha_hasta]['year']}")
		f_desde = Date.parse("#{params[:fecha_desde]['day']}-#{params[:fecha_desde]['month']}-#{params[:fecha_desde]['year']}")	
		numdias = f_hasta - f_desde

		#Obtiene los horarios por dia
		horarios = params[:horas]

		#Obtiene el tipo de servicio por horario
		servicios = params[:tipserv]

		#Obtiene los costos por tipo de servicio
		precios = params[:costo]

		for i in 0..(numdias-1)
			for j in 1..horarios.size
				if horarios["h#{j}"].size > 0 then
					@trip = Trip.new

					#Coloca el estado AGENDADO
					@trip.estado = 1

					#Calcula la fecha y hora del viaje
					f_viaje = f_desde + i.days
					@trip.fechaHoraViaje = Time.parse("#{f_viaje.to_s} #{horarios["h#{j}"]}", "%Y-%m-%d %H:%M")

					#Calcula la duracion del viaje
					@trip.tiempoDuracion = params[:duracion]

					#Obtiene el tipo de servicio
					@trip.service_type_id = servicios["ts#{j}"].to_i

					#Obtiene el costo del viaje
					@trip.precio = precios["c#{servicios["ts#{j}"]}"]

					#Obtiene informacion sobre los asientos
					@trip.numAsientosReservados = 0
					@trip.numAsientosAdquiridos = 0

					#Obtiene informacion sobre el origen y destino
					@trip.station_salida_id = params[:t_salida]
					@trip.station_llegada_id = params[:t_llegada]

					#Asigna la promocion a la cual se incluye el viaje
					if params[:promocion].size > 0 and @trip.fechaHoraViaje <= Promotion.find(params[:promocion]).fecha_fin and @trip.fechaHoraViaje >= Promotion.find(params[:promocion]).fecha_inicio
						@trip.promotion_id = params[:promocion]
					end

					#Genera un codigo para el viaje
					anho = @trip.fechaHoraViaje.year.to_s
					anhoinf = anho.size-2
					anhosup = anho.size-1
				
					aux_month = @trip.fechaHoraViaje.month.to_s
					month = aux_month.size == 1 ? "0#{aux_month}" : aux_month

					usec = Time.now.usec.to_s[0..3]
				
					c_salida = Station.find(params[:t_salida]).ciudad[0]
					c_llegada = Station.find(params[:t_llegada]).ciudad[0]

					@trip.codigo = "#{c_salida}#{c_llegada}-#{anho[anhoinf..anhosup]}#{month}-#{usec}"

					#Asigna un bus al viaje
					f_inicio = @trip.fechaHoraViaje
					f_final = @trip.fechaHoraViaje + @trip.tiempoDuracion
					buses_disp = Bus.where("estado = ?",2)
				
					buses_disp.each do |bs|
						if bs.fleet.service_type_id == @trip.service_type_id then
							condicion = "((fechaHoraViaje < ? and ? < (fechaHoraViaje + INTERVAL tiempoDuracion HOUR)) "
							condicion += "or (fechaHoraViaje < ? and ? < (fechaHoraViaje + INTERVAL tiempoDuracion HOUR)) "
							condicion += "or (? < fechaHoraViaje and fechaHoraViaje < ?) "
							condicion += "or (? < (fechaHoraViaje + INTERVAL tiempoDuracion HOUR) and (fechaHoraViaje + INTERVAL tiempoDuracion HOUR) < ?)) "
							condicion += " and bus_id = ?"
							viajes = Trip.where(condicion, f_inicio, f_inicio, f_final, f_final, f_inicio, f_final, f_inicio, f_final, bs.id)
							if viajes.size == 0 then
								@trip.bus_id = bs.id
								@trip.numAsientosDisp = @trip.bus.fleet.numAsientos
							end
						end
					end
				
					#Graba el viaje
					if !@trip.save then
						error = true
					end
				end
			end
		end

    respond_to do |format|
      if !error
        format.html { redirect_to(@trip, :notice => 'Se agendaron los viajes satisfactoriamente.') }
        format.xml  { render :xml => @trip, :status => :created, :location => @trip }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @trip.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /trips/1
  # PUT /trips/1.xml
  def update
    @trip = Trip.find(params[:id])

    respond_to do |format|
      if @trip.update_attributes(params[:trip])
        format.html { redirect_to(@trip, :notice => 'Se agendaron los viajes satisfactoriamente.') }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @trip.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /trips/1
  # DELETE /trips/1.xml
  def destroy
    @trip = Trip.find(params[:id])
    @trip.destroy

    respond_to do |format|
      format.html { redirect_to(trips_url) }
      format.xml  { head :ok }
    end
  end

	def hacer_reserva
		# 0 -> DISPONIBLE
		# 1 -> OCUPADO

		@viaje = Trip.find(params[:trip_id])
		@nueva_reserva = Reservation.new
		@reservas = @viaje.reservation
		@numAsientos = @viaje.numAsientosDisp
		@asientos = Hash[]
		@tipdocs = DocumentType.order("nombre").all
		if !@numAsientos.nil? then
			for i in 1..@numAsientos
				r = Reservation.where("numAsiento = ?", i)
				r.size == 0 ? @asientos[i] = 0 : @asientos[i] = 1
				if r.size == 0
					t = Ticket.where("numAsiento = ?", i)
					t.size == 0 ? @asientos[i] = 0 : @asientos[i] = 1					
				end
			end
		end
	end

	def vender_boleto_1
		@viaje = Trip.find(params[:trip_id])
		@tipdocs = DocumentType.order("nombre").all
	end

	def vender_boleto_2
		# Parametros para la vista
		@viaje = Trip.find(params[:trip_id])
		@nuevo_ticket = Ticket.new
		@generosPelicula = MovieGenre.order("descripcion").all
		@tipdocs = DocumentType.order("nombre").all
		@tipoComida = FoodType.order("descripcion").all
		@numAsientos = @viaje.numAsientosDisp

		if params[:tipoVenta] == "Reserva" then
			# Venta a partir de reserva

			# Se indica que la venta se realizara por reserva
			@mensaje =  "RESERVA"

			# Auxiliar para verificar la existencia de la reserva
			aux_r = Reservation.joins(" INNER JOIN passengers ON reservations.passenger_id = passengers.id").where("passengers.numDocumento = ? and passengers.document_type_id = ?", params[:numero_documento], params[:tipo_documento])

			if aux_r.size > 0 then
				# Auxiliar para verificar que la reserva no haya sido utilizada
				aux_t = Ticket.joins(" INNER JOIN reservations ON tickets.reservation_id = reservations.id").where("reservations.codigo = ?", params[:codigoReserva])

				if (aux_t.size == 0) then
					# Se pasan las reservas a la vista
					@reservas = Reservation.where("codigo = ?",params[:codigoReserva])
				else
					redirect_to root_path, :notice => "La reserva ya ha sido utilizada."
				end
			else
				redirect_to root_path, :notice => "Los datos de la reserva no son validos. No existe la reserva."
			end
		elsif params[:tipoVenta] == "Directa"
			# Venta directa

			# Se indica que la venta se realizar directamente
			@mensaje =  "DIRECTA"

			# Se consulta la distribucion de asientos
			@asientos = Hash[]

			if !@numAsientos.nil? then
				for i in 1..@numAsientos
					r = Reservation.where("numAsiento = ?", i)
					r.size == 0 ? @asientos[i] = 0 : @asientos[i] = 1
					if r.size == 0
						t = Ticket.where("numAsiento = ?", i)
						t.size == 0 ? @asientos[i] = 0 : @asientos[i] = 1					
					end
				end
			end
		else
			redirect_to root_path, :notice => "No se ha elegido una opcion correcta"
		end
	end

	def vender_boleto_3
		# Parametros que se la pasa a la vista
		@reservas = Reservation.where("codigo = ?",params[:codigoReserva])
		@viaje = Trip.find(params[:trip_id].to_i)
		@mensaje = params[:tipoVenta] == "Reserva" ? "RESERVA" : "DIRECTA"
		@generosPelicula = MovieGenre.order("descripcion").all
		@tipdocs = DocumentType.order("nombre").all
		@tipoComida = FoodType.order("descripcion").all
		@nro_documento = params[:nro_documento]
		@tipo_doc = params[:tipo_doc]
		@nombre = params[:nombre]
		@ape_pat = params[:ape_pat]
		@ape_mat = params[:ape_mat]
		@tipo_comida = params[:tipo_comida]
		@genero_pelicula = params[:genero_pelicula]
		@asiento = params[:asiento]
	end

	def vender_boleto_4
		# Parametros que se le pasa a la vista
		@nuevo_ticket = Ticket.new

		@viaje = Trip.find(params[:trip_id].to_i)
		@mensaje = params[:tipoVenta] == "Reserva" ? "RESERVA" : "DIRECTA"
		@tipo_doc = params[:tipo_doc]
		@nro_documento = params[:nro_documento]
		@nombre = params[:nombre]
		@ape_pat = params[:ape_pat]
		@ape_mat = params[:ape_mat]
		@tipo_comida = params[:tipo_comida]
		@genero_pelicula = params[:genero_pelicula]
		@asiento = params[:asiento]
		@costo_por_boleto = params[:costo_boleto_sol]
		@reservas = Reservation.where("codigo = ?", params[:codigoReserva])

		# Datos de promocion
		@promocion = Promotion.joins("INNER JOIN trips ON promotions.id = trips.promotion_id").where("trips.id = ?", params[:trip_id])
		@nro_doc_pasajero_frec = params[:nro_doc_pasajero_frec]
		@utilizarPromo = params[:utilizarPromo]
		@ptos_requeridos = params[:ptos_requeridos]
		@descuento = params[:descuento]
	end

	def vender_boleto_put_1
		redirect_to :action => "vender_boleto_2",
								:trip_id => params[:trip_id],
								:tipoVenta => params[:tipoVenta],
								:codigoReserva => params[:codigoReserva],
								:numero_documento => params[:numero_documento],
								:tipo_documento => params[:tipo_documento]
	end

	def vender_boleto_put_2
		redirect_to :action => "vender_boleto_3",
								:trip_id => params[:trip_id],
								:tipo_doc => params[:tipo_doc],
								:nro_documento => params[:nro_documento],
								:nombre => params[:nombre],
								:ape_pat => params[:ape_pat],
								:ape_mat => params[:ape_mat],
								:tipo_comida => params[:tipo_comida],
								:genero_pelicula => params[:genero_pelicula],
								:asiento => params[:asiento],
								:tipoVenta => params[:tipoVenta],
								:codigoReserva => params[:codigoReserva]
	end

	def vender_boleto_put_3
		redirect_to :action => "vender_boleto_4",
								:trip_id => params[:trip_id],
								:tipo_doc => params[:tipo_doc],
								:nro_documento => params[:nro_documento],
								:nombre => params[:nombre],
								:ape_pat => params[:ape_pat],
								:ape_mat => params[:ape_mat],
								:tipo_comida => params[:tipo_comida],
								:genero_pelicula => params[:genero_pelicula],
								:asiento => params[:asiento],
								:tipoVenta => params[:tipoVenta],
								:codigoReserva => params[:codigoReserva],
								:costo_boleto_sol => params[:costo_boleto_sol],
								:nro_doc_pasajero_frec => params[:nro_doc_pasajero_frec],
								:utilizarPromo => params[:utilizarPromo],
								:ptos_requeridos => params[:ptos_requeridos],
								:descuento => params[:descuento]
	end

	def pase_a_venta
		# 0: ELIMINADO
		# 1: AGENDADO
		# 2: EN VENTA
		viaje = Trip.find(params[:trip_id])
		viaje.estado = 2
		viaje.save
		redirect_to trips_path, :notice => 'Se paso a venta el viaje con codigo #{viaje.codigo}'
	end
end
